// interface 是对象的模板，可以看作是一种类型约定，中文译为“接口”
interface Person {
  firstname: string
  lastname: string
  age: number
}

const p: Person = {
  firstname: 'jet',
  lastname: 'wang',
  age: 25,
}

interface Foo {
  bar: string
}

type A = Foo['bar'] // string

// 对象属性
interface Point {
  x: number
  y: number
}

interface A1 {
  x?: string
}

interface B {
  readonly x: number
}

// 对象的属性索引
interface C {
  [prop: string]: string
}

// 属性索引共有string、number和symbol三种类型

interface MyObj {
  [prop: string]: number

  // a: boolean
}

// 属性的数值索引，其实是指定数组的类型
interface D {
  [prop: number]: string
}

const arr: D = ['1', '2', '3']

interface E {
  [prop: string]: string
  // [prop: number]: number
}

interface F {
  [prop: string]: string
  [prop: number]: string
}

// 对象的写法
interface G {
  f(x: boolean): string
}

interface G1 {
  f: (x: boolean) => string
}

interface G2 {
  f: { (x: boolean): string }
}

const f = 'f'

interface G3 {
  [f](x: boolean): string
}

// 函数
interface Add {
  (x: number, y: number): number
}

const myAdd: Add = function (x, y) {
  return x + y
}

// 构造函数
interface ErrorConstructor {
  new (msg: string): Error
}